#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define maxn 201
const int INF = 1<<28;

int n,V,Q;
int T[maxn];
int dis[maxn][maxn];
bool configured[maxn];

int main(){
	cin>>n>>V;
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++)
			dis[i][j] = INF;
		dis[i][i]=0;
	}
	for(int i=0; i<n; i++)
		cin>>T[i];
	for(int i=0; i<V; i++){
		int u,v,w;
		cin>>u>>v>>w;
		dis[u][v]=w;
		dis[v][u]=w;
	}
	cin>>Q;
	for(int q=0; q<Q; q++){
		int u,v,t;
		cin>>u>>v>>t;
		//这题的做法实在太巧妙了……加深了我对floyd的认识
		for(int k=0; k<n; k++){
			if(t >= T[k] && !configured[k]){
				configured[k] = true;
				for(int i=0; i<n; i++)
					for(int j=0; j<n; j++)
						if(dis[i][j] > dis[i][k]+dis[k][j])
							//这边不需要再判断t>=T[u]和v了，因为如果要dis[u][v]中间点一定是valid的，而且如果判断了的话答案会错，因为上面有configured，之前看过的就不会再看了！(这是关键)
							dis[i][j] = dis[i][k]+dis[k][j];
			}
		}
		if(t>=T[u] && t>=T[v] && dis[u][v] < INF-1)
			cout << dis[u][v] << endl;
		else
			cout<<"-1"<<endl;
	}
	return 0;
}